package xml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import start.Start;

/**
 * Abstrakte Basisklasse, welche Grundfunktionen zum Bearbeiten von XML zur Verfuegung stellt.
 * Abgelittene Klassen spezialisieren ihr Vorhaben mit Hilfe der Funktionen dieser Klasse
 * @author Dominik Korittki
 */
public abstract class XML {
	/** XML Datei */
	protected File file;
	/** Wurzelelement des XML Baums */
	protected Element root;
	
	/**
	 * Prueft ob Datei bereits vorhanden und liest dann den Inhalt der XML aus um ihn in abstrakte Baumstruktur darzustellen
	 * @throws IOException Eingabe Ausgabe Fehler
	 * @throws JDOMException XML spezifischer Fehler
	 */
	public XML(File file) throws JDOMException, IOException {
		this.file = file;
		if(Start.getRezeptexml().exists()) { //Wenn Datei existiert und das sollte sie!
			update();
		} else {
			FileNotFoundException e = new FileNotFoundException("Recipe-XML nicht gefunden");
			throw e;
		}
	}
	
	/**
	 * Liest alle vorhandene Rezepte aus der XML in Variable root ein
	 * @throws IOException Eingabe Ausgabe Fehler 
	 * @throws JDOMException XML spezifischer Fehler
	 */
	protected void update() throws JDOMException, IOException {	
		Document doc = getDocument();
		
		//root element herauslesen
		root = doc.getRootElement();
		doc.detachRootElement();
	}
	
	/**
	 * Speichert den XML Baum im Arbeitsspeicher als Datei bzw. uerberschreibt Diese
	 * @throws IOException Eingabe Ausgabe Fehler 
	 * @throws JDOMException XML spezifischer Fehler
	 */
	public void createXMLFile() throws IOException, JDOMException {
		Document doc = new Document(root);
		FileOutputStream out = new FileOutputStream(file.getPath());
		XMLOutputter serializer = new XMLOutputter(Format.getPrettyFormat());
		serializer.output(doc, out);
		update();
	}
	
	/**
	 * Generiert ein Dokument-Typ des XML Baums
	 * @return Dokument welcher den XML Baum beinhaltet
	 * @throws JDOMException XML spezifischer Fehler
	 * @throws IOException Eingabe Ausgabe Fehler 
	 */
	protected Document getDocument() throws JDOMException, IOException {
		SAXBuilder builder = new SAXBuilder();
		Document doc = (Document)builder.build(file.getPath());
		return doc;
	}
}
